package top.tenebrous.yzl.im.sender;

import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;

/**
 * 抽象的生产者处理器
 *
 * 为保证分布式下session共享问题，提供发布订阅的方式，以消息中间件进行session的共享
 * 其本质是以服务端监听中间件，当websocket接收到新的消息后，以生产者方式往中间件写入消息，通知消费者进行消费
 * onMessage  <----  messageCenter
 *                        ^
 *                        |
 * client    ----->  websocket server    -->   handler message --->  websocket client
 *
 * 该接口提供发送消息的能力，每个发送共享消息的服务端，都应实现该接口，并重写 broadcastMessage() 方法，以此来达到群发的效果
 *
 * 此外，继承该接口并重写方法后，您需要将其实现类纳入Spring ioc容器进行管理，后面的具体处理消息的过程，由框架为您完成
 * 如果希望多实现，那么将逐条进行广播发送，且没有先后顺序，如果希望有个先后顺便，可以在实现类上加入 {@link org.springframework.core.annotation.Order} 注解
 * 或继续实现 {@link org.springframework.core.Ordered} 接口，排序也将依次从小到大执行
 * ps: 该接口默认提供了Redis发布订阅的消息队列，您可以在配置文件中进行更改，否则默认提供的实现，将继续保持运行
 *
 * @author yazhang6
 */
public interface AbstractSenderHandler {

    /**
     * 广播消息
     *
     * @param session   session
     * @param message   消息内容
     */
    void broadcastMessage(WebSocketSession session, TextMessage message);

}
